#对不处于最后付息周期的固定利率债券
'''计算债券麦克劳林久期的函数
    y:到期收益率
    B:表示债券市场全价；
    c:票面年利率；
    t:付息周期期限
    f:年付息频率；
    y:到期收益率；
    d:债券结算日至下一最近付息日之间的实际天数；
    N:结算日至到期兑付日的债券付息次数；
    TS:当前付息周期的实际天数。
    FV:债券面值;'''


import numpy as np
def MID_fixbond_nolastcoupon(y,B,c,t,f,d,N,TS,FV):
        Wcoupon=[]
        for i in np.arange(1,N+1):
            Wcoupon.append((c*t*(d/TS/f+(i-1)/f)/pow(1+y/f,d/TS+i-1)))
            Scoupon=sum(Wcoupon)
            MID=FV/B*(Scoupon+(d/TS/f+(N-1)/f)/pow(1+y/f,d/TS+N-1))
        return MID



Bond_MID=MID_fixbond_nolastcoupon(y=0.028754,B=101.2364,c=0.0302,t=1,f=1,d=276,N=4,TS=365,FV=100)
print('计算得到债券的麦克劳林久期',Bond_MID)